package com.ccnode.codegenerator.taikaoback.util;

import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.Data;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 分页结果类
 * @param <T> 数据类型
 */
@Data
public class PageResult<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 数据列表
     */
    private List<T> list;

    /**
     * 分页信息
     */
    private Pagination pagination;

    /**
     * 构造函数
     * @param list 数据列表
     * @param pagination 分页信息
     */
    public PageResult(List<T> list, Pagination pagination) {
        this.list = list;
        this.pagination = pagination;
    }

    /**
     * 从MyBatis Plus的IPage对象创建PageResult
     * @param page MyBatis Plus分页对象
     * @param <T> 数据类型
     * @return PageResult对象
     */
    public static <T> PageResult<T> of(IPage<T> page) {
        Pagination pagination = new Pagination(
            page.getCurrent(),
            page.getSize(),
            page.getTotal()
        );
        return new PageResult<>(page.getRecords(), pagination);
    }

    /**
     * 转换为Map格式（保持与现有接口兼容）
     * @return Map格式的分页结果
     */
    public Map<String, Object> toMap() {
        Map<String, Object> result = new HashMap<>();
        result.put("list", this.list);
        result.put("total", this.pagination.getTotal());
        result.put("page", this.pagination.getCurrentPage());
        result.put("size", this.pagination.getPageSize());
        result.put("pages", this.pagination.getTotalPages());
        return result;
    }

    /**
     * 从MyBatis Plus的IPage对象创建Map格式结果
     * @param page MyBatis Plus分页对象
     * @param <T> 数据类型
     * @return Map格式的分页结果
     */
    public static <T> Map<String, Object> toMap(IPage<T> page) {
        Map<String, Object> result = new HashMap<>();
        result.put("list", page.getRecords());
        result.put("total", page.getTotal());
        result.put("page", page.getCurrent());
        result.put("size", page.getSize());
        result.put("pages", page.getPages());
        return result;
    }

    /**
     * 分页信息类
     */
    @Data
    public static class Pagination implements Serializable {
        private static final long serialVersionUID = 1L;

        /**
         * 当前页码
         */
        private long currentPage;

        /**
         * 每页数量
         */
        private long pageSize;

        /**
         * 总记录数
         */
        private long total;

        /**
         * 总页数
         */
        private long totalPages;

        /**
         * 是否有上一页
         */
        private boolean hasPrevious;

        /**
         * 是否有下一页
         */
        private boolean hasNext;

        /**
         * 构造函数
         * @param currentPage 当前页码
         * @param pageSize 每页数量
         * @param total 总记录数
         */
        public Pagination(long currentPage, long pageSize, long total) {
            this.currentPage = currentPage;
            this.pageSize = pageSize;
            this.total = total;
            this.totalPages = (total + pageSize - 1) / pageSize;
            this.hasPrevious = currentPage > 1;
            this.hasNext = currentPage < totalPages;
        }
    }
}